import logging
import os
from logging.handlers import RotatingFileHandler


class CustomLogger:
    def __init__(self, logger_name, log_file_path, console_level=logging.INFO, file_level=logging.DEBUG,
                 max_bytes=1024 * 1024, backup_count=3):
        """
        初始化自定义日志记录器

        :param logger_name: 日志记录器的名称
        :param log_file_path: 日志文件的存放路径
        :param console_level: 控制台输出的日志级别，默认为 INFO
        :param file_level: 文件输出的日志级别，默认为 DEBUG
        :param max_bytes: 日志文件的最大大小，默认为 1MB
        :param backup_count: 最多保留的备份文件数量，默认为 3
        """
        # 提取日志文件所在目录
        log_dir = os.path.dirname(log_file_path)
        # 如果目录不存在，则创建目录
        if log_dir and not os.path.exists(log_dir):
            try:
                os.makedirs(log_dir)
            except FileExistsError:
                pass
            except OSError as e:
                print(f"创建日志目录 {log_dir} 时出错: {e}")

            else:
                print(f"创建日志目录 {log_dir} 成功")

        # 创建一个 logger 对象
        self.logger = logging.getLogger(logger_name)
        self.logger.setLevel(logging.DEBUG)

        # 创建一个控制台处理器
        console_handler = logging.StreamHandler()
        console_handler.setLevel(console_level)

        # 创建一个 RotatingFileHandler，设置最大文件大小和备份数量
        file_handler = RotatingFileHandler(log_file_path, maxBytes=max_bytes, backupCount=backup_count)
        file_handler.setLevel(file_level)

        # 创建一个日志格式器
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s')

        # 将格式器添加到处理器
        console_handler.setFormatter(formatter)
        file_handler.setFormatter(formatter)

        # 将处理器添加到 logger 对象
        self.logger.addHandler(console_handler)
        self.logger.addHandler(file_handler)

    def get_logger(self):
        """
        获取配置好的日志记录器

        :return: 配置好的日志记录器对象
        """
        return self.logger


if __name__ == '__main__':
    # 自定义日志记录器的名称和日志文件存放位置
    logger_name = 'my_custom_logger'
    log_file_path = 'logs/custom_app.log'

    # 创建自定义日志记录器实例
    custom_logger = CustomLogger(logger_name, log_file_path)
    logger = custom_logger.get_logger()

    # 测试日志输出
    logger.debug('This is a debug message')
    logger.info('This is an info message')
    logger.warning('This is a warning message')
    logger.error('This is an error message')
    logger.critical('This is a critical message')

    # 测试大量日志输出
    for i in range(10000):
        logger.debug(f'This is a debug message {i}')